package ar.com.ctrln.persistence.model.evento;

import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Transient;

import org.zkoss.calendar.api.CalendarEvent;

import ar.com.ctrln.persistence.model.sistema.cuentas.Autorizacion;

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class EventoCalendario implements CalendarEvent {

	@Id
	@GeneratedValue(strategy = GenerationType.TABLE)
	@Column(name = "id_evento")
	private long id;

	@Column
	private String titulo;

	@Column
	private String contenido;

	@Column
	private Date fechaInicio;

	@Column
	private Date fechaFin;

	@Column
	private boolean bloqueado;

	@Column
	private String colorTitulo;

	@Column
	private String colorContenido;

	@Column
	private String observacion;

	@OneToMany(mappedBy = "evento")
	private Set<Participante> participantes;

	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name = "EVENTO_AUTORIZACION", joinColumns = { @JoinColumn(name = "id_evento") }, inverseJoinColumns = { @JoinColumn(name = "id_autorizacion") })
	private Collection<Autorizacion> autorizaciones;

	@ManyToOne
	@JoinColumn
	private TipoEvento tipoEvento;

	@Transient
	public static final SimpleDateFormat FORMAT_DAY = new SimpleDateFormat(
			"dd/MM/yyyy");
	@Transient
	public static final SimpleDateFormat FORMAT_HOURS = new SimpleDateFormat(
			"HH:mm");
	@Transient
	public static final SimpleDateFormat FORMAT_COMPLETE = new SimpleDateFormat(
			"dd/MM/yyyy HH:mm");

	public void setTitle(String title) {
		this.titulo = title;
	}

	public void setContent(String content) {
		this.contenido = content;
	}

	public void setBeginDate(Date beginDate) {
		this.fechaInicio = beginDate;
	}

	public void setEndDate(Date endDate) {
		this.fechaFin = endDate;
	}

	public void setLoked(boolean loked) {
		this.bloqueado = loked;
	}

	public void setHeaderColor(String headerColor) {
		this.colorTitulo = headerColor;
	}

	public void setContentColor(String contentColor) {
		this.colorContenido = contentColor;
	}

	@Override
	public Date getBeginDate() {
		return this.fechaInicio;
	}

	@Override
	public String getContent() {
		return this.contenido;
	}

	@Override
	public String getContentColor() {
		return this.colorTitulo;
	}

	@Override
	public Date getEndDate() {
		return this.fechaFin;
	}

	@Override
	public String getHeaderColor() {
		return this.colorContenido;
	}

	@Override
	public String getTitle() {
		return this.titulo;
	}

	@Override
	public String getZclass() {
		return null;
	}

	@Override
	public boolean isLocked() {
		return this.bloqueado;
	}

	public void setId(long id) {
		this.id = id;
	}

	public long getId() {
		return id;
	}

	public void setAutorizaciones(Collection<Autorizacion> autorizaciones) {
		this.autorizaciones = autorizaciones;
	}

	public Collection<Autorizacion> getAutorizaciones() {
		return autorizaciones;
	}

	public void setTipoEvento(TipoEvento tipoEvento) {
		this.tipoEvento = tipoEvento;
	}

	public TipoEvento getTipoEvento() {
		return tipoEvento;
	}

	public void setParticipantes(Set<Participante> participantes) {
		this.participantes = participantes;
	}

	public Set<Participante> getParticipantes() {
		return participantes;
	}

	public String getFechaInicioString() {
		return FORMAT_DAY.format(fechaInicio);
	}

	public String getFechaFinString() {
		return FORMAT_DAY.format(fechaFin);
	}

	public String getHoraInicioString() {
		return FORMAT_HOURS.format(fechaInicio);
	}

	public String getHoraFinString() {
		return FORMAT_HOURS.format(fechaFin);
	}

	public String getFechaCompletaInicioString() {
		return FORMAT_COMPLETE.format(fechaInicio);
	}

	public String getFechaCompletaFinString() {
		return FORMAT_COMPLETE.format(fechaFin);
	}

	public void setObservacion(String observacion) {
		this.observacion = observacion;
	}

	public String getObservacion() {
		return observacion;
	}
}
